﻿package org.abcFrame.core
{
   import flash.events.EventDispatcher;
   import flash.events.IEventDispatcher;
   
   /**
    * 负责事件的发送和侦听 ，使用了单例模式
    * @author Administrator
    * 
    */   
   public class AbcEventDispatcher
   {
      private static var _instance : AbcEventDispatcher;  
      private var eventDispatcher : IEventDispatcher;
      
      public static function get instance() : AbcEventDispatcher 
      {
         if ( _instance == null )
            _instance = new AbcEventDispatcher();
           return _instance;
      }
      
      public function AbcEventDispatcher( target:IEventDispatcher = null ) :void
      {
         eventDispatcher = new EventDispatcher( target );
      }
      
	  /**
	   * 侦听事件 
	   * @param type 事件类型
	   * @param listener 处理事件的侦听器函数。
	   * @param view 可视化对象，默认为null
	   * @param useCapture:Boolean (default = false) — 确定侦听器是运行于捕获阶段、目标阶段还是冒泡阶段。 如果将 useCapture 设置为 true，则侦听器只在捕获阶段处理事件，而不在目标或冒泡阶段处理事件。 如果 useCapture 为 false，则侦听器只在目标或冒泡阶段处理事件。 要在所有三个阶段都侦听事件，请调用两次 addEventListener，一次将 useCapture 设置为 true，第二次再将 useCapture 设置为 false。 
	   * @param priority:int (default = 0) — 事件侦听器的优先级。 优先级由一个带符号的 32 位整数指定。 数字越大，优先级越高。 优先级为 n 的所有侦听器会在优先级为 n -1 的侦听器之前得到处理。 如果两个或更多个侦听器共享相同的优先级，则按照它们的添加顺序进行处理。 默认优先级为 0。 
	   * @param useWeakReference:Boolean (default = false) — 确定对侦听器的引用是强引用，还是弱引用。 强引用（默认值）可防止您的侦听器被当作垃圾回收。 弱引用则没有此作用。 
	   * 
	   */      
      public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false ) : void 
      {
		  //trace("addEventListener:"+type)
          eventDispatcher.addEventListener( type, listener, useCapture, priority, useWeakReference );

		  }
      
	  /**
	   * 删除侦听 
	   * @param type 事件类型
	   * @param listener 处理事件的侦听器函数。
	   * @param view 可视化对象，默认为null
	   * @param useCapture:Boolean (default = false) — 指出是否为捕获阶段或目标阶段和冒泡阶段注册了侦听器。 如果为捕获阶段以及目标和冒泡阶段注册了侦听器，则需要对 removeEventListener() 进行两次调用才能将这两个侦听器删除，一次调用将 useCapture() 设置为 true，另一次调用将 useCapture() 设置为 false。 
	   * 
	   */      
      public function removeEventListener( type:String, listener:Function, view:AbcView=null,useCapture:Boolean = false ) : void 
      {  
		  
         eventDispatcher.removeEventListener( type, listener, useCapture );
		 
		 
      }
      
	  /**
	   * 发送事件 
	   * @param type 事件类型
	   * @param value 事件引用的数据
	   * @param view 可视化对象，默认为null
	   * @return Boolean
	   * 
	   */      
	  public function dispatcher(type:String,value:*=null): Boolean 
	  {   
			var evt:AbcEvent = new AbcEvent(type)	
			//trace("dispatcher:"+evt.type+":"+value)
			evt.data = value
			return eventDispatcher.dispatchEvent(evt)
			
		}
      

	  /**
	   * 检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。
	   * @param type 事件的类型。  
	   * @return Boolean
	   * 
	   */
      public function hasEventListener( type:String ) : Boolean 
      {
         return eventDispatcher.hasEventListener( type );
      }
      
	  /**
	   * 检查是否用此 EventDispatcher 对象或其任何始祖为指定事件类型注册了事件侦听器。 
	   * @param type 事件的类型。  
	   * @return Boolean
	   * 
	   */      
      public function willTrigger(type:String) : Boolean 
      {
         return eventDispatcher.willTrigger( type );
      }
   }
}